package modelo;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

import javax.media.opengl.GL;

/**
 * Classe que representa uma spline.
 * 
 * @author jean
 * @author diego
 */
public class Spline extends ObjetoGrafico {

	private List<Ponto> pontos;

	/**
	 * Cria uma nova Spline
	 * 
	 * @param cor
	 *            - a cor
	 */
	public Spline(Color cor) {
		super(cor);
		pontos = new ArrayList<Ponto>();
	}

	/**
	 * Retorna a lista de pontos da Spline
	 * 
	 * @return a lista de pontos da Spline
	 */
	public List<Ponto> getPontos() {
		return pontos;
	}

	/**
	 * Atribui a lista de pontos da Spline
	 * 
	 * @param pontos
	 *            a lista de pontos da Spline
	 */
	public void setPontos(List<Ponto> pontos) {
		this.pontos = pontos;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void desenhar(GL gl) {
		gl.glBegin(GL.GL_LINES);
		gl.glColor3f(getCor().getRed(), getCor().getGreen(), getCor().getBlue());
		float ponto1 = 0;
		float ponto2 = 0;
		float ponto3 = 0;
		float ponto4 = 0;
		Ponto p1 = null, p2 = null, p3 = null, p4 = null;
		p1 = p2 = p3 = p4 = pontos.get(0);
		if (pontos.size() > 1) {
			p2 = p3 = p4 = pontos.get(1);
		}
		if (pontos.size() > 2) {
			p3 = p4 = pontos.get(2);
		}
		if (pontos.size() > 2) {
			p3 = p4 = pontos.get(2);
		}
		if (pontos.size() > 3) {
			p4 = pontos.get(3);
		}
		double inicioX = p1.getX();
		double inicioY = p1.getY();
		double fimX = 0;
		double fimY = 0;

		float delta = (1.0f / 100);

		for (float t = delta; t <= 1; t += delta) {

			ponto1 = (float) Math.pow((1 - t), 3);
			ponto2 = (float) ((float) 3 * t * (Math.pow((1 - t), 2)));
			ponto3 = (float) ((float) 3 * Math.pow(t, 2) * (1 - t));
			ponto4 = (float) Math.pow(t, 3);

			fimX = (ponto1 * p1.getX()) + (ponto2 * p2.getX())
					+ (ponto3 * p3.getX()) + (ponto4 * p4.getX());
			fimY = (ponto1 * p1.getY()) + (ponto2 * p2.getY())
					+ (ponto3 * p3.getY()) + (ponto4 * p4.getY());
			gl.glVertex2d(inicioX, inicioY);
			gl.glVertex2d(fimX, fimY);

			getbBox().recalcularBBox(new Ponto(inicioX, inicioY, 0, 0));

			inicioX = fimX;
			inicioY = fimY;
		}

		gl.glVertex2d(inicioX, inicioY);
		gl.glVertex2d(p4.getX(), p4.getY());
		gl.glEnd();
		gl.glFlush();
	}

	/**
	 * Adiciona um ponto na Spline
	 * 
	 * @param ponto
	 */
	public void addPonto(Ponto ponto) {
		pontos.add(ponto);
	}
}
